package com.example.api;

import com.example.entity.Post;
import com.github.lianjiatech.retrofit.spring.boot.core.RetrofitClient;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.*;

import java.util.List;

/**
 * 文章 API 接口
 * 演示表单提交和文件上传功能
 * 
 * @author example
 * @since 2024-01-01
 */
@RetrofitClient(baseUrl = "${external.api.jsonplaceholder.base-url}")
public interface PostApi {

    /**
     * 获取所有文章
     */
    @GET("/posts")
    Call<List<Post>> getPosts();

    /**
     * 根据 ID 获取文章
     * 
     * @param id 文章 ID
     * @return 文章信息
     */
    @GET("/posts/{id}")
    Call<Post> getPost(@Path("id") Long id);

    /**
     * 根据用户 ID 获取文章列表
     * 
     * @param userId 用户 ID
     * @return 文章列表
     */
    @GET("/posts")
    Call<List<Post>> getPostsByUser(@Query("userId") Long userId);

    /**
     * 创建文章
     * 
     * @param post 文章信息
     * @return 创建的文章信息
     */
    @POST("/posts")
    Call<Post> createPost(@Body Post post);

    /**
     * 使用表单方式创建文章
     * 
     * @param userId 用户 ID
     * @param title 标题
     * @param body 内容
     * @return 创建的文章信息
     */
    @FormUrlEncoded
    @POST("/posts")
    Call<Post> createPostWithForm(@Field("userId") Long userId, 
                                  @Field("title") String title, 
                                  @Field("body") String body);

    /**
     * 更新文章
     * 
     * @param id 文章 ID
     * @param post 文章信息
     * @return 更新后的文章信息
     */
    @PUT("/posts/{id}")
    Call<Post> updatePost(@Path("id") Long id, @Body Post post);

    /**
     * 删除文章
     * 
     * @param id 文章 ID
     */
    @DELETE("/posts/{id}")
    Call<Void> deletePost(@Path("id") Long id);

    /**
     * 文件上传示例（模拟接口）
     * 注意：JSONPlaceholder 不支持文件上传，这里仅作为示例
     * 
     * @param file 文件
     * @return 响应结果
     */
    @Multipart
    @POST("/upload")
    Call<ResponseBody> uploadFile(@Part MultipartBody.Part file);

    /**
     * 多文件上传示例
     * 
     * @param description 描述
     * @param files 文件列表
     * @return 响应结果
     */
    @Multipart
    @POST("/upload/multiple")
    Call<ResponseBody> uploadMultipleFiles(@Part("description") String description,
                                         @Part List<MultipartBody.Part> files);
} 